package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.annotation.CacheFind;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.util.ObjectMapperUtil;
import com.jt.vo.EasyUITree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.security.Key;
import java.util.ArrayList;
import java.util.List;


@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired(required = false)    //jedis对象在程序启动时不是必需的
    private Jedis jedis;
    @Autowired
    private ItemCatMapper itemCatMapper;

    @Override
    public ItemCat findItemCatNameById(Long id) {
        return itemCatMapper.selectById(id);
    }

    /**
     * 1.通过parentId查询数据库信息,返回值结果为list<itemCat>
     * 2.将ItemCat信息转为EasyUITree对象
     * 3.返回的是list<EasyUITree>
     *
     * @param parentId
     * @return
     */
    //查询数据库的代码
    @Override
    @CacheFind(Key = "ITEM_CAT_PARENTID")
    public List<EasyUITree> findItemCatList(Long parentId) {
        //1.根据父级分类的id查询数据
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        List<ItemCat> catList = itemCatMapper.selectList(queryWrapper);

        //2.需要将数据进行转换,遍历catList,封装EasyUITree,添加到集合中
        List<EasyUITree> treeList = new ArrayList<>();
        for (ItemCat itemcat : catList) {
            Long id = itemcat.getId();
            String text = itemcat.getName();
            //使用三元运算 判断一级菜单是否关闭
            String state = itemcat.getIsParent() ? "closed" : "open";
            EasyUITree easyUITree = new EasyUITree(id, text, state);
            //封装返回值结果
            treeList.add(easyUITree);
        }
        return treeList;
    }

    /**
     * 从缓存中查询数据 K:V
     * true 直接返回数据
     * false 查询数据库
     * <p>
     * Key有什么特点 :1 应该动态变化   2.key应该表示业务属性
     * key=ITEM_CAT_PARENTID::parentId
     */

    @Override
    public List<EasyUITree> findItemCache(Long parentId) {
        Long startTime = System.currentTimeMillis();
        String key = "ITEM_CAT_PARENTID::" + parentId;
        List<EasyUITree> treeList = new ArrayList<>();//定义集合,方便后面获取返回值类型
        String json = jedis.get(key);
        //判断缓存中有没有数据
        if (jedis.exists(key)) {
            //表示缓存中有数据,就直接通过key从缓存中取数据
            treeList = ObjectMapperUtil.toObject(json, treeList.getClass());
            Long endTime = System.currentTimeMillis();
            System.out.println("redis查询数据耗时:=" + (endTime - startTime) + "毫秒");
        } else {
            //如果缓存没数据,就先去查数据库
            treeList = findItemCatList(parentId);
            Long endTime1 = System.currentTimeMillis();
            json = ObjectMapperUtil.toJson(treeList);
            //为了方便后续实现缓存处理,将数据添加到redis中去
            jedis.set(key, json);
            System.out.println("第一次查询数据库耗时:=" + (endTime1 - startTime) + "毫秒");
        }

        return treeList;
    }
}
